namespace study4_02 {

    // typeof 操作符 用于获取变量或表达式的类型。既可以在类型层面使用，也可以在运行时使用

    // 运行时的typeof，用于获取变量的原始类型，返回的类型时一个字符串

    let str = 'hello'
    console.log(typeof str); // string

    let num = 23
    console.log(typeof num); // number

    let bool = true
    console.log(typeof bool); // boolean

    let obj = { key: 'value' }
    console.log(typeof obj); // object

    let func = function () { }
    console.log(typeof func); // function


    // 类型层面的typeof，用于获取一个变量或对象的类型，以便在其他的地方使用。

    // 示例 1：获取变量的类型
    let person = {
        name: '林萃',
        age: 20
    }

    type PersonType = typeof person

    let anotenerPerson: PersonType = {
        name: '志超',
        age: 22
    }
    console.log(anotenerPerson); // { name: '志超', age: 22 }

    // 示例 2：结合 typeof 和 keyof
    // typeof 和 keyof一起使用，获取对象的键类型，并限制对这些键得到访问
    let person2 = {
        name: '崔梦娇',
        age: 22
    }

    type person2Keys = keyof typeof person2; // "name" | "age"
    function getValue(key: person2Keys) {
        return person2[key]
    }
    console.log(getValue("name")); // 崔梦娇
    console.log(getValue("age")); // 22

    // 应用场景
    // 1、动态类型定义
    // 使用typeof 可以从现有的值或对象中推导类型，确保类型定义和实际数据保持一致

    // 2、函数参数类型推导
    // 通过typeof获取某个变量的类型，可以用于函数参数，避免重复的类型定义
    function printPerson(p: typeof person) {
        console.log(p.name, p.age);

    }
    printPerson({ name: 'lwj', age: 22 })

    // 3、类型保护
    // typeof在运行时还可以配合ts的类型保护机制，用于条件分支中判断类型，帮助ts推断更具体的类型
    function process(value: string | number) {
        if (typeof value === 'string') {
            console.log(value.toUpperCase());

        } else if (typeof value === 'number') {
            console.log(value.toFixed(2));

        }
    }

    // 总结
    // 1、运行时 typeof：用于获取变量的原始类型，返回一个字符串
    // 2、类型层面 typeof：用于获取某个变量或对象的类型，以便在其他地方使用，避免重复定义类型
    // 3、实际应用：typeof 常用于动态类型定义、函数参数类型推导、和类型保护等场景











}